package com.chen.threadpool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

// 手动创建一个线程池

/**
 * 拒绝策略
 * 1、new ThreadPoolExecutor.AbortPolicy()，如果线程队列已满，中止新增的线程，并抛出异常
 * 2、new ThreadPoolExecutor.CallerRunsPolicy()，如果线程队列已满，让调用线程处理该线程
 * 3、new ThreadPoolExecutor.DiscardPolicy()，如果线程队列已满，丢弃新增的线程，而且不抛出异常
 * 4、new ThreadPoolExecutor.DiscardOldestPolicy()，如果线程队列已满，新增的线程尝试和最早的线程竞争，而且不抛出异常
 */
public class ThreadPoolFields {
    public static void main(String[] args) {

        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                2,// 核心线程池大小
                Runtime.getRuntime().availableProcessors(),//最大线程池大小
                2,// 超时等待时间
                TimeUnit.SECONDS,// 时间单位
                new LinkedBlockingQueue<>(3),// 阻塞队列
                Executors.defaultThreadFactory(),// 线程工程，一般不动
                new ThreadPoolExecutor.DiscardOldestPolicy()// 线程池拒绝策略
        );

        for (int i = 0; i < 9; i++) {
            threadPool.execute(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " OK");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    // 线程池用完后，程序结束，关闭线程池
                    threadPool.shutdown();
                }
            });
        }

    }
}
